#ifndef SERIALPORTUTIL_H
#define SERIALPORTUTIL_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>

class SerialPortUtil : public QObject
{
    Q_OBJECT
public:
    explicit SerialPortUtil(QObject *parent = nullptr);
    ~SerialPortUtil();

    /**
     * @brief openPort  打开串口
     * @param portName  串口名称
     * @param baudRate  波特率
     * @param dataBits  数据位
     * @param parity    校验位
     * @param stopBits  停止位
     * @return
     */
    bool openPort(QString portName,
                  qint32 baudRate,
                  QSerialPort::DataBits dataBits,
                  QSerialPort::Parity parity,
                  QSerialPort::StopBits stopBits);

    /**
     * @brief isOpen    串口是否打开
     * @return
     */
    bool isOpen();

    /**
     * @brief closePort 关闭串口
     */
    void closePort();

    /**
     * @brief getAvailablePortNameList  获取可用的串口名称列表
     * @return
     */
    QStringList getAvailablePortNameList();

    /**
     * @brief write 写入数据
     * @param data
     */
    void write(QByteArray data);
    void write(const char *data, qint64 len);

    /**
     * @brief bytes2Hex byte转为string
     * @param data
     * @return
     */
    QString bytes2Hex(QByteArray data);

    QByteArray hex2Bytes(QString data);

    /**
     * @brief readyRead 读取数据
     * @param data
     */
    QByteArray readyRead();

    QByteArray sendAndRead(QString data);

signals:
    /**
     * @brief readyRead 串口读取信号
     * @param data  实际返回值
     */
    void readed(QString data);

    void abc(QString abc);

public slots:
    /**
     * @brief readyRead_slot    串口读取信号槽
     */
    void readyRead_slot();

private:
    QSerialPort *m_serial;

};

#endif // SERIALPORTUTIL_H
